package com.example.tpl.system.controller;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import jakarta.validation.Valid;
import jakarta.validation.groups.Default;

import com.example.tpl.system.annotation.OperateLog;
import com.example.tpl.system.service.RoleService;
import com.example.tpl.system.util.Result;
import com.example.tpl.system.util.ResultPage;
import com.example.tpl.system.vo.common.DeleteBatchReqVo;
import com.example.tpl.system.vo.common.QueryDetailReqVo;
import com.example.tpl.system.vo.common.UpdateStatusReq;
import com.example.tpl.system.vo.common.valid.Insert;
import com.example.tpl.system.vo.common.valid.Update;
import com.example.tpl.system.vo.req.AllocatedListReq;
import com.example.tpl.system.vo.req.CancelAuthUserAllReq;
import com.example.tpl.system.vo.req.CancelAuthUserReq;
import com.example.tpl.system.vo.req.QueryRoleMenuReq;
import com.example.tpl.system.vo.req.QueryRoleReqVo;
import com.example.tpl.system.vo.req.RoleMenuReq;
import com.example.tpl.system.vo.req.RoleReqVo;
import com.example.tpl.system.vo.req.SelectAuthUserAllReq;
import com.example.tpl.system.vo.req.UnallocatedListReq;
import com.example.tpl.system.vo.resp.RoleMenuResp;
import com.example.tpl.system.vo.resp.RoleRespVo;
import com.example.tpl.system.vo.resp.UserRespVo;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;

/**
 * 描述：角色信息
 * 作者：刘飞华
 * 日期：2025/01/15 15:09:35
 */
@Tag(name = "2.角色信息")
@RestController
@RequestMapping("/role")
public class RoleController {

    @Autowired
    private RoleService roleService;

    /**
     * 添加角色信息
     *
     * @param role 请求参数
     * @return Result<Integer>
     * @author 刘飞华
     * @date: 2025/01/15 15:09:35
     */
    @ApiOperationSupport(order = 1)
    @Operation(summary = "1.1 添加角色信息")
    @PostMapping("/addRole")
    @OperateLog(description = "【角色信息】添加角色信息")
    public Result<Integer> addRole(@RequestBody @Validated({Insert.class, Default.class}) RoleReqVo role) {
        return roleService.addRole(role);
    }

    /**
     * 删除角色信息
     *
     * @param role 请求参数
     * @return Result<Integer>
     * @author 刘飞华
     * @date: 2025/01/15 15:09:35
     */
    @ApiOperationSupport(order = 2)
    @Operation(summary = "1.2 删除角色信息")
    @PostMapping("/deleteRole")
    @OperateLog(description = "【角色信息】删除角色信息")
    public Result<Integer> deleteRole(@RequestBody @Valid DeleteBatchReqVo role) {
        return roleService.deleteRole(role);
    }

    /**
     * 更新角色信息
     *
     * @param role 请求参数
     * @return Result<Integer>
     * @author 刘飞华
     * @date: 2025/01/15 15:09:35
     */
    @ApiOperationSupport(order = 3)
    @Operation(summary = "1.3 更新角色信息")
    @PostMapping("/updateRole")
    @OperateLog(description = "【角色信息】更新角色信息")
    public Result<Integer> updateRole(@RequestBody @Validated({Update.class, Default.class}) RoleReqVo role) {
        return roleService.updateRole(role);
    }

    /**
     * 更新角色信息状态
     *
     * @param role 请求参数
     * @return Result<Integer>
     * @author 刘飞华
     * @date: 2025/01/15 15:09:35
     */
    @ApiOperationSupport(order = 4)
    @Operation(summary = "1.4 更新角色信息状态")
    @PostMapping("/updateRoleStatus")
    @OperateLog(description = "【角色信息】更新角色信息状态")
    public Result<Integer> updateRoleStatus(@RequestBody @Valid UpdateStatusReq role) {
        return roleService.updateRoleStatus(role);
    }

    /**
     * 查询角色信息详情
     *
     * @param role 请求参数
     * @return RoleResp
     * @author 刘飞华
     * @date: 2025/01/15 15:09:35
     */
    @ApiOperationSupport(order = 5)
    @Operation(summary = "1.5 查询角色信息详情")
    @PostMapping("/queryRoleDetail")
    @OperateLog(description = "【角色信息】查询角色信息详情")
    public Result<RoleRespVo> queryRoleDetail(@RequestBody @Valid QueryDetailReqVo role) {
        return roleService.queryRoleDetail(role);
    }

    /**
     * 查询角色信息列表
     *
     * @param role 请求参数
     * @return RoleResp
     * @author 刘飞华
     * @date: 2025/01/15 15:09:35
     */
    @ApiOperationSupport(order = 6)
    @Operation(summary = "1.6 查询角色信息列表")
    @PostMapping("/queryRoleList")
    @OperateLog(description = "【角色信息】查询角色信息列表")
    public Result<ResultPage<RoleRespVo>> queryRoleList(@RequestBody @Valid QueryRoleReqVo role) {
        return roleService.queryRoleList(role);
    }

    /**
     * 查询角色关联的菜单
     *
     * @param roleMenuReq 请求参数
     * @return MenuRespVo
     * @author 刘飞华
     * @date: 2025/01/15 15:09:35
     */
    @ApiOperationSupport(order = 7)
    @Operation(summary = "1.7 查询角色关联的菜单")
    @PostMapping("/queryRoleMenu")
    @OperateLog(description = "【角色信息】查询角色关联的菜单")
    public Result<RoleMenuResp> queryRoleMenu(@RequestBody @Valid QueryRoleMenuReq roleMenuReq) {
        return roleService.queryRoleMenu(roleMenuReq);
    }

    /**
     * 更新角色关联的菜单
     *
     * @param roleMenuReq 请求参数
     * @return Integer
     * @author 刘飞华
     * @date: 2025/01/15 15:09:35
     */
    @ApiOperationSupport(order = 8)
    @Operation(summary = "1.8 更新角色关联的菜单")
    @PostMapping("/updateRoleMenu")
    @OperateLog(description = "【角色信息】更新角色关联的菜单")
    public Result<Integer> updateRoleMenu(@RequestBody @Valid RoleMenuReq roleMenuReq) {
        return roleService.updateRoleMenu(roleMenuReq);
    }

    /**
     * 查询已分配用户角色列表
     *
     * @param allocatedListReq 请求参数
     * @return UserRespVo
     * @author 刘飞华
     * @date: 2025/01/15 15:09:35
     */
    @ApiOperationSupport(order = 9)
    @Operation(summary = "1.9 查询已分配用户角色列表")
    @PostMapping("/queryAllocatedList")
    @OperateLog(description = "【角色信息】查询已分配用户角色列表")
    public Result<ResultPage<UserRespVo>> queryAllocatedList(@RequestBody @Valid AllocatedListReq allocatedListReq) {
        return roleService.queryAllocatedList(allocatedListReq);
    }

    /**
     * 查询未分配用户角色列表
     *
     * @param unallocatedListReq 请求参数
     * @return UserRespVo
     * @author 刘飞华
     * @date: 2025/01/15 15:09:35
     */
    @ApiOperationSupport(order = 10)
    @Operation(summary = "1.10 查询未分配用户角色列表")
    @PostMapping("/queryUnallocatedList")
    @OperateLog(description = "【角色信息】查询未分配用户角色列表")
    public Result<ResultPage<UserRespVo>> queryUnallocatedList(@RequestBody @Valid UnallocatedListReq unallocatedListReq) {
        return roleService.queryUnallocatedList(unallocatedListReq);
    }

    /**
     * 取消授权用户
     *
     * @param cancelAuthUserReq 请求参数
     * @return Integer
     * @author 刘飞华
     * @date: 2025/01/15 15:09:35
     */
    @ApiOperationSupport(order = 11)
    @Operation(summary = "1.11 取消授权用户")
    @PostMapping("/cancelAuthUser")
    @OperateLog(description = "【角色信息】取消授权用户")
    public Result<Integer> cancelAuthUser(@RequestBody @Valid CancelAuthUserReq cancelAuthUserReq) {
        return roleService.cancelAuthUser(cancelAuthUserReq);
    }

    /**
     * 批量取消授权用户
     *
     * @param authUserAllReq 请求参数
     * @return Integer
     * @author 刘飞华
     * @date: 2025/01/15 15:09:35
     */
    @ApiOperationSupport(order = 12)
    @Operation(summary = "1.12 批量取消授权用户")
    @PostMapping("/batchCancelAuthUser")
    @OperateLog(description = "【角色信息】批量取消授权用户")
    public Result<Integer> batchCancelAuthUser(@RequestBody @Valid CancelAuthUserAllReq authUserAllReq) {
        return roleService.batchCancelAuthUser(authUserAllReq);
    }

    /**
     * 批量选择用户授权
     *
     * @param authUserAllReq 请求参数
     * @return Integer
     * @author 刘飞华
     * @date: 2025/01/15 15:09:35
     */
    @ApiOperationSupport(order = 13)
    @Operation(summary = "1.13 批量选择用户授权")
    @PostMapping("/batchAuthUser")
    @OperateLog(description = "【角色信息】批量选择用户授权")
    public Result<Integer> batchAuthUser(@RequestBody @Valid SelectAuthUserAllReq authUserAllReq) {
        return roleService.batchAuthUser(authUserAllReq);
    }
}
